//对于js来说，我们可以用提供的定时器(setInterval或setTimeout,两者其实都可以)，制造一个逐帧播放的舞台现场（stage)，
//每一帧清空画布后再把所有的精灵全画上去,下一帧再清再画，只要改变精灵的相应属性就能产生动画的效果。
//所以我们对于精灵(Sprite)类来说，要提供一个画（draw)的方法，一个进入每一帧时(onenter)要执行的方法；
//对于舞台（stage）对象，就提供往舞台添加和删除精灵（addChild/removeChild）的方法，定时器的相关操作方法（start,stop,step)。
//再来看，其实Sprite也是可以添加精灵达到一样的层次关系的，所以也依然可以提供addChild,removeChild的方法，
//所以我们可以把Sprite做为基类，stage对象继承了Sprite的方法后可根据需要重写和添加自己的方法

//  创建一个400*490的游戏界面
var game = new Phaser.Game(400, 490, Phaser.AUTO, 'game_div');
var game_state = {};

//创建main状态，包含游戏
game_state.main = function() { };  
game_state.main.prototype = {
	// prototype 原型
	
	// preload用来加载一些资源，
    preload: function() { 
        //  改变游戏的背景色  stage管理对象
        this.game.stage.backgroundColor = '#71c5cf';

        //  添加鸟（bird）和管道（pipe）的图片
        this.game.load.image('bird', 'assets/bird.png');  
        this.game.load.image('pipe', 'assets/pipe.png');      
    },

    // Fuction called after 'preload' to setup the game 
    //create用来进行一些对象的创建及初始化，
    create: function() { 
        //  在屏幕上显示鸟       sprite是精灵类  初始化  在坐标为（100，245）的位置放鸟图 
        this.bird = this.game.add.sprite(100, 245, 'bird');
        
        //  给鸟增加重力使它坠落  
        this.bird.body.gravity.y = 1000; 

        //  按空格键是让鸟跳跃 
        var space_key = this.game.input.keyboard.addKey(Phaser.Keyboard.SPACEBAR); 
        space_key.onDown.add(this.jump, this); 

        //  创建一组20个管道
        this.pipes = game.add.group();
        this.pipes.createMultiple(20, 'pipe');  

        //  计时器    1.5s一组管道
        this.timer = this.game.time.events.loop(1500, this.add_row_of_pipes, this);           

        // 在屏幕的顶部添加一个分数标签
        this.score = 0;
        var style = { font: "30px Arial", fill: "#ffffff" };//样式
        this.label_score = this.game.add.text(20, 20, "0", style);//位置，添加样式  
    },

    
    //update 是游戏的主循环。
    update: function() {
    	
        // 跳出边界  重启游戏
        if (this.bird.inWorld == false)
            this.restart_game(); 

        // 鸟重叠（撞上）管道重启游戏
        this.game.physics.overlap(this.bird, this.pipes, this.restart_game, null, this);      
    },

    // 跳跃 
    jump: function() {
        this.bird.body.velocity.y = -350;
    },

    // 重启游戏
    restart_game: function() {
        // 游戏重新开始时停止计时器
        this.game.time.events.remove(this.timer);

        // main状态开始运行，启动游戏 
        this.game.state.start('main');
    },
	
    // 在屏幕上添加一个管道
    add_one_pipe: function(x, y) {
        
        var pipe = this.pipes.getFirstDead();

        // 设置管道新位置
        pipe.reset(x, y);  

         // 添加管道左移速度 
        pipe.body.velocity.x = -200; 
               
        // 当管道移出不可见时清除 
        pipe.outOfBoundsKill = true;
    },

    // 增加一排6个管道
    add_row_of_pipes: function() {
        var hole = Math.floor(Math.random()*5)+1;
        
        for (var i = 0; i < 8; i++)
            if (i != hole && i != hole +1) 
                this.add_one_pipe(400, i*60+10);   
    
        this.score += 1;
        this.label_score.content = this.score; //得分自加   在屏幕上显示现在得分
    },
};

//  添加‘main’状态并启动游戏
game.state.add('main', game_state.main);  
game.state.start('main'); 

